class Animal {
  constructor(name){
    this.name = name
  }
  run(){
    return `${this.name} is running`
  }
}
const snake = new Animal('liyi')
console.log(snake.run())

// class Dog extends Animal{
//   bark(){
//     return `${this.name} is barking`
//   }
// }

// const xiaobao = new Dog('xiaobao')
// console.log(xiaobao.run())
// console.log(xiaobao.bark())


class Cat extends Animal {
  static categories = ['mammal'] // 类上面直接加的静态属性
  constructor(name) { // 对constructor进行了重写
    super(name) // 注意：重写构造函数的话要使用super方法，
    console.log(this.name)
  }
  run() { // 对run方法进行重写
    return 'Meow, ' + super.run()
  }
}
const maomao = new Cat('maomao')
console.log(maomao.run())
console.log(Cat.categories) // 类上的属性不用实例化，直接调用即可


// Public 修饰的属性或方法是共有的
// Private: 修饰的属性或方法是私有的
// Protected 修饰的属性或方法是受保护的